﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class ConvencaoAditivo
    {
        #region Variaveis Membro
        private int _idConvencaoAditivo;
        private Convencao _convencao;
        private string _descricao;
        private DateTime _dtInicio;
        private DateTime _dtFim;
        private string _path;
        private GENTEEntities _context;
        #endregion

        #region Parametros
        public int IdConvencaoAditivo
        {
            get { return _idConvencaoAditivo; }
            set { _idConvencaoAditivo = value; }
        }

        public Convencao Convencao
        {
            get { return _convencao; }
            set { _convencao = value; }
        }

        public string Descricao
        {
            get { return _descricao; }
            set { _descricao = value; }
        }

        public DateTime DtInicio
        {
            get { return _dtInicio; }
            set { _dtInicio = value; }
        }

        public DateTime DtFim
        {
            get { return _dtFim; }
            set { _dtFim = value; }
        }

        public string Path
        {
            get { return _path; }
            set { _path = value; }
        }
        #endregion

        #region Construtores
        public ConvencaoAditivo()
        {
            _context = new GENTEEntities();
        }
        #endregion

        #region Métodos Privados
        private int RetornaIdConvencaoAditivo()
        {
            try
            {
                int idconvencaoaditivo = 0;

                var consulta = (from aditivo in _context.tab_sindicato_convencao_aditivo
                                orderby aditivo.id_convencao_sindicato_aditivo descending
                                select new
                                {
                                    aditivo.id_convencao_sindicato_aditivo
                                }).Take(1);

                idconvencaoaditivo = consulta.ToList()[0].id_convencao_sindicato_aditivo;

                return idconvencaoaditivo;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void AtualizarPath(string path)
        {
            try
            {
                tab_sindicato_convencao_aditivo tabConvencao = (from aditivo in _context.tab_sindicato_convencao_aditivo 
                                                                where aditivo.id_convencao_sindicato_aditivo == this._idConvencaoAditivo 
                                                                select aditivo).First();

                tabConvencao.path = path;
                _context.SaveChanges();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private bool ValidaCadastro()
        {
            try
            {
                bool valida = false;

                if (this._convencao == null)
                    throw new Exception("É necessário informar a convenção!");

                if (this._convencao.IdConvencaoSindicato == 0)
                    throw new Exception("É necessário informar a convenção!");

                if (this._descricao == string.Empty)
                    throw new Exception("É necessário informar a descrição!");

                if (this._dtInicio == null)
                    throw new Exception("É necessário informar a data de início!");

                if (this._dtFim == null)
                    throw new Exception("É necessário informar a data de término!");

                if (this._path == string.Empty)
                    throw new Exception("É necessário informar o documento!");

                valida = true;
                return valida;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Métodos Públicos
        public List<ConvencaoAditivo> SelectAditivos(int _convencao, bool _carregaConvencao)
        {
            try
            {
                List<ConvencaoAditivo> listAditivos = new List<ConvencaoAditivo>();

                var consulta = from aditivos in _context.tab_sindicato_convencao_aditivo
                               join convencao in _context.tab_sindicato_convencao on aditivos.tab_sindicato_convencao.id_convencao_sindicato equals convencao.id_convencao_sindicato
                               where convencao.id_convencao_sindicato == _convencao
                               select new
                               {
                                   aditivos.id_convencao_sindicato_aditivo,
                                   aditivos.tab_sindicato_convencao.id_convencao_sindicato,
                                   aditivos.descricao,
                                   aditivos.dt_inicio,
                                   aditivos.dt_fim,
                                   aditivos.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    ConvencaoAditivo aditivo = new ConvencaoAditivo();
                    aditivo.IdConvencaoAditivo = list.id_convencao_sindicato_aditivo;
                    aditivo.Convencao = new Convencao(list.id_convencao_sindicato, _carregaConvencao);
                    aditivo.Descricao = list.descricao;
                    aditivo.DtInicio = list.dt_inicio;
                    aditivo.DtFim = list.dt_fim;
                    aditivo.Path = list.path;

                    listAditivos.Add(aditivo);
                }

                return listAditivos;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void Salvar()
        {
            try
            {
                if (ValidaCadastro())
                {
                    if (this._idConvencaoAditivo == 0)
                    {
                        tab_sindicato_convencao_aditivo tabConvencaoAditivo = new tab_sindicato_convencao_aditivo();
                        tabConvencaoAditivo.tab_sindicato_convencaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_sindicato_convencao", "id_convencao_sindicato", this._convencao.IdConvencaoSindicato);
                        tabConvencaoAditivo.descricao = this._descricao;
                        tabConvencaoAditivo.dt_inicio = this._dtInicio;
                        tabConvencaoAditivo.dt_fim = this._dtFim;
                        tabConvencaoAditivo.path = "";

                        _context.AddTotab_sindicato_convencao_aditivo(tabConvencaoAditivo);
                        _context.SaveChanges();

                        this._idConvencaoAditivo = RetornaIdConvencaoAditivo();

                        string _nomearquivo = "";
                        TipoDocumento tipodocto = new TipoDocumento();
                        _nomearquivo = tipodocto.ObterNomeDocumento(this._convencao.Sindicato.IdOrganizacao, TipoDocumento.TipoDocto.Convencao_Coletiva, this._idConvencaoAditivo.ToString());

                        AtualizarPath(this._path + _nomearquivo);
                        this._path = this._path + _nomearquivo;

                        // atualiza a data de prorrogação da convenção coletiva
                        tab_sindicato_convencao tabConvencao = (from convencao in _context.tab_sindicato_convencao
                                                                where convencao.id_convencao_sindicato == this._convencao.IdConvencaoSindicato
                                                                select convencao).First();

                        tabConvencao.dt_prorrogacao = this._dtFim;
                        _context.SaveChanges();
                    }
                    else
                    {
                        tab_sindicato_convencao_aditivo tabConvencaoAditivo = (from aditivo in _context.tab_sindicato_convencao_aditivo
                                                                               where aditivo.id_convencao_sindicato_aditivo == this._idConvencaoAditivo
                                                                               select aditivo).First();
                        tabConvencaoAditivo.tab_sindicato_convencaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_sindicato_convencao", "id_convencao_sindicato", this._convencao.IdConvencaoSindicato);
                        tabConvencaoAditivo.descricao = this._descricao;
                        tabConvencaoAditivo.dt_inicio = this._dtInicio;
                        tabConvencaoAditivo.dt_fim = this._dtFim;
                        tabConvencaoAditivo.path = this._path;

                        _context.SaveChanges();
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion
    }
}
